// 处理data中的数据，当数据变化，处理数据发生变化
class Observer {
  constructor(data) {
    this.walk(data)
  }
  walk(data) {
    if(!data || typeof data !== 'object') {
      return
    }
    Object.keys(data).forEach((dataKey) => {
      this.defineReactive(data, dataKey, data[dataKey])
    })
  }
  defineReactive(obj, key, val) {
    // 处理对象的值是object时,这里就是递归
    this.walk(val)
    let that = this;

    let dep = new Dep()
    Object.defineProperty(obj, key, {
      enumerable: true,
      configurable: true,
      get: function() {
        // 先这样写。
        Dep.target && dep.addSub(Dep.target)
        return val //  Object.defineProperty需要第三个值参与赋值
      },
      set: function(newValue) {
        if(newValue === val ) return
        // 处理新赋值的值是对象的情况
        that.walk(newValue)
        val = newValue
        dep.notify()
        // console.log('发送通知', newValue) 
        // 发送通知。
      }
    })
  }
}